package ongd.web;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import ongd.negocio.gestion.ControladorProyectoSC;
import ongd.negocio.gestion.PersonaContacto;
import ongd.negocio.gestion.Proyecto;
import ongd.negocio.gestion.Subvencion;
import ongd.servicios.persistencia.exceptions.PreexistingEntityException;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;

/**
 * Clase que se encargará de insertar un proyecto de Sensibilización o 
 * cooperación.
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class Insertar_ProyectoSensibilizacionCooperacion extends ABean {

    /**
     * Objeto de tipo ControladorProyectoSC que nos servirá para realizar 
     * las operaciones necesarias de los proyectos.
     */
    private ControladorProyectoSC contProyecto;
    /**
     * Objeto de tipo Proyeto que va a contener el proyecto que se va a crear.
     */
    private Proyecto proyecto;
    /** 
     * Variable que permite saber si trabajamos con un proyecto de cooperacion 
     * o de sensibilizacion en función de la página cargada.
     */
    private boolean proyectoCooperacion;
    /**
     * Objeto de tipo List que va a contener un conjunto de personas de contacto
     * que irán asociadas al proyecto.
     */
    private List<PersonaContacto> personasContacto;
    /**
     * Objeto de tipo PersonaContacto que va a contener la persona de contacto 
     * que se va a asociar con el proyecto.
     */
    private PersonaContacto personaContacto;
    /**
     * Objeto de tipo Subvención que va a contener el valor de una subvención
     * seleccionada.
     */
    private Subvencion subvencion;
    /**
     * Objeto de tipo String que va a contener el título de la página donde
     * estemos.
     */
    private String titulo;

    /**
     * Constructor de la clase.
     */
    public Insertar_ProyectoSensibilizacionCooperacion() {
        proyecto = new Proyecto();
        personaContacto = new PersonaContacto();
        personasContacto = new ArrayList<PersonaContacto>();
        subvencion = new Subvencion();
    }

    /**
     * Método que carga los valores correspondientes a la página de xhtml abierta. 
     */
    @Override
    public void cargaInicial() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            SesionBean sesion = getSesionBean();
            if (sesion.iniciadaSesion()) {
                contProyecto = sesion.getControladorProyectoSC();
                if (sesion.getStrVariable().compareTo("cooperacion") == 0) {
                    //Si hemos elegido proyecto de cooperacion
                    titulo = "Insertar - Nuevo Proyecto de Cooperación";
                    proyecto.setTipo("C");
                    proyectoCooperacion = true;
                } else {
                    if (sesion.getStrVariable().compareTo("sensibilizacion") == 0) {
                        titulo = "Insertar - Nuevo Proyecto de Sensibilización";
                        proyecto.setTipo("S");
                        proyectoCooperacion = false;
                    }
                }
            }
        }
    }

    /**
     * Método que sube un archivo adjunto a la aplicación.
     * @param event Fichero a subir
     */
    public void subirAdjunto(FileUploadEvent event) {
        try {
            String nombre;
            SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
            nombre = sdf.format(new Date()) + "_" + event.getFile().getFileName();
            getSesionBean().guardar(nombre, event.getFile().getInputstream());
            proyecto.setDocumentoAdjunto(nombre);
        } catch (IOException ex) {
            Logger.getLogger(Insertar_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Método que crea un proyecto con los datos correspondientes.
     * @return null.
     */
    public String crearProyecto() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                String creado = contProyecto.crearProyecto(proyecto, personasContacto);
                if (creado.compareTo("Correcto") == 0) {
                    requestContext.addCallbackParam("finOK", true);
                    proyecto = new Proyecto();
                    //Volvemos a dejar el tipo del proyecto igual
                    if (proyectoCooperacion) {
                        proyecto.setTipo("C");
                    } else {
                        proyecto.setTipo("S");
                    }
                    personasContacto = new ArrayList<PersonaContacto>();
                    contProyecto.setSubvenciones(new ArrayList<Subvencion>());
                } else if (creado.compareTo("Repetido") == 0) {
                    requestContext.addCallbackParam("nombreRep", true);
                } else {
                    requestContext.addCallbackParam("Incorrecto", true);
                    proyecto = new Proyecto();
                    personasContacto = new ArrayList<PersonaContacto>();
                    contProyecto.setSubvenciones(new ArrayList<Subvencion>());
                    if (proyectoCooperacion) {
                        proyecto.setTipo("C");
                    } else {
                        proyecto.setTipo("S");
                    }
                }
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(Insertar_ProyectoSensibilizacionCooperacion.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Insertar_ProyectoSensibilizacionCooperacion.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que añade una persona de contacto a la lista siempre que esta 
     * tenga valores en los campos obligatorios. 
     * @return null.
     */
    public String annadirPersonaContacto() {
        RequestContext requestContext = RequestContext.getCurrentInstance();
        //Insertamos en la lista de contactos si tiene valores
        if (personaContacto.getNombre().compareTo("") != 0 && personaContacto.getDireccion().compareTo("") != 0
                && personaContacto.getCargo().compareTo("") != 0 && personaContacto.getTelefono1().compareTo("") != 0) {
            //Añadimos la persona a la lista de contactos
            personasContacto.add(personaContacto);
            requestContext.addCallbackParam("PersonaOK", true);

        } else {
            requestContext.addCallbackParam("noPersona", true);
        }
        personaContacto = new PersonaContacto();
        return null;
    }

    /**
     * Método que quita una persona de contacto seleccionada de la lista.
     * @return null
     */
    public String quitarPersonaContacto() {
        personasContacto.remove(personaContacto);
        return null;
    }

    /**
     * Método que quita una subvención de la lista.
     * @return null
     */
    public String quitarSubvencion() {
        contProyecto.getSubvenciones().remove(subvencion);
        return null;
    }

    /**
     * Método que devuelve el proyecto.
     * @return proyecto con el que estamos trabajando.
     * @see #setProyecto
     */
    public Proyecto getProyecto() {
        return proyecto;
    }

    /**
     * Método que nos dice si trabajamos con un proyecto de cooperacion.
     * @return true si el proyecto es de cooperación.
     *          false si el proyecto es de sensibilización
     */
    public boolean isProyectoCooperacion() {
        return proyectoCooperacion;
    }

    /**
     * Método que da un nuevo valor al proyecto.
     * @param proyecto nuevo proyecto. 
     * @see #getProyecto
     */
    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    /**
     * Método que asigna un nuevo valor a la variable que nos indica si estamos trabajando con un proyecto de cooperación.
     * @param proyectoCooperacion nuevo valor.
     */
    public void setProyectoCooperacion(boolean proyectoCooperacion) {
        this.proyectoCooperacion = proyectoCooperacion;
    }

    /**
     * Método que devuelve la persona de contacto con la que estamos trabajando. 
     * @return persona de contacto.
     * @see #setPersonaContacto
     */
    public PersonaContacto getPersonaContacto() {
        return personaContacto;
    }

    /**
     * Método que devuelve la lista de contactos que vamos a asignar al proyecto.
     * @return lista de personas de contacto.
     * @see #setPersonasContacto
     */
    public List<PersonaContacto> getPersonasContacto() {
        return personasContacto;
    }

    /**
     * Método que asigna un nuevo valor a la persona de contacto.
     * @param personaContacto nuevo valor. 
     * @see #getPersonaContacto
     */
    public void setPersonaContacto(PersonaContacto personaContacto) {
        this.personaContacto = personaContacto;
    }

    /**
     * Método que da un nuevo valor a la lista de personas de contacto.
     * @param personasContacto nuevo valor para la lista. 
     * @see #getPersonasContacto
     */
    public void setPersonasContacto(List<PersonaContacto> personasContacto) {
        this.personasContacto = personasContacto;
    }

    /**
     * Método que devuelve el valor de la variable contProyecto.
     * @return contProyecto
     * @see #setContProyecto
     */
    public ControladorProyectoSC getContProyecto() {
        return contProyecto;
    }

    /**
     * Método que establece el valor de la variable contProyecto.
     * @param contProyecto Nuevo valor de la variable
     * @see #getContProyecto
     */
    public void setContProyecto(ControladorProyectoSC contProyecto) {
        this.contProyecto = contProyecto;
    }

    /**
     * Método que devuelve el valor de la variable subvención.
     * @return subvencion
     * @see #setSubvencion
     */
    public Subvencion getSubvencion() {
        return subvencion;
    }

    /**
     * Método que establece el valor de la variable subvención.
     * @param subvencion Nuevo valor de la variable
     * @see #getSubvencion
     */
    public void setSubvencion(Subvencion subvencion) {
        this.subvencion = subvencion;
    }

    /**
     * Método que devuelve el valor de la variable titulo.
     * @return titulo
     * @see #setTitulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Método que establece el valor de la variable título.
     * @param titulo Nuevo valor de la variable
     * @see #getTitulo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}
